// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*!
 * @file test_data.h
 * This header file contains the declaration of the described types in the IDL file.
 *
 * This file was generated by the tool gen.
 */

#ifndef _FAST_DDS_GENERATED_TEST_TEST_DATA_H_
#define _FAST_DDS_GENERATED_TEST_TEST_DATA_H_


#include <fastcdr/utils/fixed_size_string.h>

#include <stdint.h>
#include <array>
#include <string>
#include <vector>
#include <map>
#include <bitset>

#if defined(_WIN32)
#if defined(EPROSIMA_USER_DLL_EXPORT)
#define eProsima_user_DllExport __declspec( dllexport )
#else
#define eProsima_user_DllExport
#endif  // EPROSIMA_USER_DLL_EXPORT
#else
#define eProsima_user_DllExport
#endif  // _WIN32

#if defined(_WIN32)
#if defined(EPROSIMA_USER_DLL_EXPORT)
#if defined(test_data_SOURCE)
#define test_data_DllAPI __declspec( dllexport )
#else
#define test_data_DllAPI __declspec( dllimport )
#endif // test_data_SOURCE
#else
#define test_data_DllAPI
#endif  // EPROSIMA_USER_DLL_EXPORT
#else
#define test_data_DllAPI
#endif // _WIN32

namespace eprosima {
namespace fastcdr {
class Cdr;
} // namespace fastcdr
} // namespace eprosima


namespace test {
    /*!
     * @brief This class represents the enumeration Type defined by the user in the IDL file.
     * @ingroup TEST_DATA
     */
    enum Type : uint32_t
    {
        kImage,
        kJson,
        kText
    };
    /*!
     * @brief This class represents the structure Header defined by the user in the IDL file.
     * @ingroup TEST_DATA
     */
    class Header
    {
    public:

        /*!
         * @brief Default constructor.
         */
        eProsima_user_DllExport Header();

        /*!
         * @brief Default destructor.
         */
        eProsima_user_DllExport ~Header();

        /*!
         * @brief Copy constructor.
         * @param x Reference to the object test::Header that will be copied.
         */
        eProsima_user_DllExport Header(
                const Header& x);

        /*!
         * @brief Move constructor.
         * @param x Reference to the object test::Header that will be copied.
         */
        eProsima_user_DllExport Header(
                Header&& x);

        /*!
         * @brief Copy assignment.
         * @param x Reference to the object test::Header that will be copied.
         */
        eProsima_user_DllExport Header& operator =(
                const Header& x);

        /*!
         * @brief Move assignment.
         * @param x Reference to the object test::Header that will be copied.
         */
        eProsima_user_DllExport Header& operator =(
                Header&& x);

        /*!
         * @brief Comparison operator.
         * @param x test::Header object to compare.
         */
        eProsima_user_DllExport bool operator ==(
                const Header& x) const;

        /*!
         * @brief Comparison operator.
         * @param x test::Header object to compare.
         */
        eProsima_user_DllExport bool operator !=(
                const Header& x) const;

        /*!
         * @brief This function sets a value in member type
         * @param _type New value for member type
         */
        eProsima_user_DllExport void type(
                test::Type _type);

        /*!
         * @brief This function returns the value of member type
         * @return Value of member type
         */
        eProsima_user_DllExport test::Type type() const;

        /*!
         * @brief This function returns a reference to member type
         * @return Reference to member type
         */
        eProsima_user_DllExport test::Type& type();

        /*!
         * @brief This function copies the value in member name
         * @param _name New value to be copied in member name
         */
        eProsima_user_DllExport void name(
                const std::string& _name);

        /*!
         * @brief This function moves the value in member name
         * @param _name New value to be moved in member name
         */
        eProsima_user_DllExport void name(
                std::string&& _name);

        /*!
         * @brief This function returns a constant reference to member name
         * @return Constant reference to member name
         */
        eProsima_user_DllExport const std::string& name() const;

        /*!
         * @brief This function returns a reference to member name
         * @return Reference to member name
         */
        eProsima_user_DllExport std::string& name();

        /*!
         * @brief This function returns the maximum serialized size of an object
         * depending on the buffer alignment.
         * @param current_alignment Buffer alignment.
         * @return Maximum serialized size.
         */
        eProsima_user_DllExport static size_t getMaxCdrSerializedSize(
                size_t current_alignment = 0);

        /*!
         * @brief This function returns the serialized size of a data depending on the buffer alignment.
         * @param data Data which is calculated its serialized size.
         * @param current_alignment Buffer alignment.
         * @return Serialized size.
         */
        eProsima_user_DllExport static size_t getCdrSerializedSize(
                const test::Header& data,
                size_t current_alignment = 0);


        /*!
         * @brief This function serializes an object using CDR serialization.
         * @param cdr CDR serialization object.
         */
        eProsima_user_DllExport void serialize(
                eprosima::fastcdr::Cdr& cdr) const;

        /*!
         * @brief This function deserializes an object using CDR serialization.
         * @param cdr CDR serialization object.
         */
        eProsima_user_DllExport void deserialize(
                eprosima::fastcdr::Cdr& cdr);



        /*!
         * @brief This function returns the maximum serialized size of the Key of an object
         * depending on the buffer alignment.
         * @param current_alignment Buffer alignment.
         * @return Maximum serialized size.
         */
        eProsima_user_DllExport static size_t getKeyMaxCdrSerializedSize(
                size_t current_alignment = 0);

        /*!
         * @brief This function tells you if the Key has been defined for this type
         */
        eProsima_user_DllExport static bool isKeyDefined();

        /*!
         * @brief This function serializes the key members of an object using CDR serialization.
         * @param cdr CDR serialization object.
         */
        eProsima_user_DllExport void serializeKey(
                eprosima::fastcdr::Cdr& cdr) const;

    private:

        test::Type m_type;
        std::string m_name;
    };
    /*!
     * @brief This class represents the structure Test defined by the user in the IDL file.
     * @ingroup TEST_DATA
     */
    class Test
    {
    public:

        /*!
         * @brief Default constructor.
         */
        eProsima_user_DllExport Test();

        /*!
         * @brief Default destructor.
         */
        eProsima_user_DllExport ~Test();

        /*!
         * @brief Copy constructor.
         * @param x Reference to the object test::Test that will be copied.
         */
        eProsima_user_DllExport Test(
                const Test& x);

        /*!
         * @brief Move constructor.
         * @param x Reference to the object test::Test that will be copied.
         */
        eProsima_user_DllExport Test(
                Test&& x);

        /*!
         * @brief Copy assignment.
         * @param x Reference to the object test::Test that will be copied.
         */
        eProsima_user_DllExport Test& operator =(
                const Test& x);

        /*!
         * @brief Move assignment.
         * @param x Reference to the object test::Test that will be copied.
         */
        eProsima_user_DllExport Test& operator =(
                Test&& x);

        /*!
         * @brief Comparison operator.
         * @param x test::Test object to compare.
         */
        eProsima_user_DllExport bool operator ==(
                const Test& x) const;

        /*!
         * @brief Comparison operator.
         * @param x test::Test object to compare.
         */
        eProsima_user_DllExport bool operator !=(
                const Test& x) const;

        /*!
         * @brief This function copies the value in member head
         * @param _head New value to be copied in member head
         */
        eProsima_user_DllExport void head(
                const test::Header& _head);

        /*!
         * @brief This function moves the value in member head
         * @param _head New value to be moved in member head
         */
        eProsima_user_DllExport void head(
                test::Header&& _head);

        /*!
         * @brief This function returns a constant reference to member head
         * @return Constant reference to member head
         */
        eProsima_user_DllExport const test::Header& head() const;

        /*!
         * @brief This function returns a reference to member head
         * @return Reference to member head
         */
        eProsima_user_DllExport test::Header& head();
        /*!
         * @brief This function copies the value in member data
         * @param _data New value to be copied in member data
         */
        eProsima_user_DllExport void data(
                const std::vector<char>& _data);

        /*!
         * @brief This function moves the value in member data
         * @param _data New value to be moved in member data
         */
        eProsima_user_DllExport void data(
                std::vector<char>&& _data);

        /*!
         * @brief This function returns a constant reference to member data
         * @return Constant reference to member data
         */
        eProsima_user_DllExport const std::vector<char>& data() const;

        /*!
         * @brief This function returns a reference to member data
         * @return Reference to member data
         */
        eProsima_user_DllExport std::vector<char>& data();

        /*!
         * @brief This function returns the maximum serialized size of an object
         * depending on the buffer alignment.
         * @param current_alignment Buffer alignment.
         * @return Maximum serialized size.
         */
        eProsima_user_DllExport static size_t getMaxCdrSerializedSize(
                size_t current_alignment = 0);

        /*!
         * @brief This function returns the serialized size of a data depending on the buffer alignment.
         * @param data Data which is calculated its serialized size.
         * @param current_alignment Buffer alignment.
         * @return Serialized size.
         */
        eProsima_user_DllExport static size_t getCdrSerializedSize(
                const test::Test& data,
                size_t current_alignment = 0);


        /*!
         * @brief This function serializes an object using CDR serialization.
         * @param cdr CDR serialization object.
         */
        eProsima_user_DllExport void serialize(
                eprosima::fastcdr::Cdr& cdr) const;

        /*!
         * @brief This function deserializes an object using CDR serialization.
         * @param cdr CDR serialization object.
         */
        eProsima_user_DllExport void deserialize(
                eprosima::fastcdr::Cdr& cdr);



        /*!
         * @brief This function returns the maximum serialized size of the Key of an object
         * depending on the buffer alignment.
         * @param current_alignment Buffer alignment.
         * @return Maximum serialized size.
         */
        eProsima_user_DllExport static size_t getKeyMaxCdrSerializedSize(
                size_t current_alignment = 0);

        /*!
         * @brief This function tells you if the Key has been defined for this type
         */
        eProsima_user_DllExport static bool isKeyDefined();

        /*!
         * @brief This function serializes the key members of an object using CDR serialization.
         * @param cdr CDR serialization object.
         */
        eProsima_user_DllExport void serializeKey(
                eprosima::fastcdr::Cdr& cdr) const;

    private:

        test::Header m_head;
        std::vector<char> m_data;
    };
} // namespace test

#endif // _FAST_DDS_GENERATED_TEST_TEST_DATA_H_